function fn1(x) {
  return x + 1
}
function fn2(x) {
  return x + 2
}
function fn3(x) {
  return x + 3
}
function fn4(x) {
  return x + 4
}

function compose(...fn) {
  // 如果参数不是数组，将参数返回
  if (!fn.length) return (v) => v
  // 如果只有一个函数，将该函数返回
  if (fn.length === 1) return fn[0]
  // 迭代地组合函数
  return fn.reduce((pre, cur) => {
    // 需要将参数传递
    return (...args) => pre(cur(...args))
  })
}

const a = compose(fn1, fn2, fn3, fn4)
console.log(a(1))
